package aop.crosscutting;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

public class LogAspect {
	/*
	 * around 시점을 처리할 공통 처리 메소드.
	 * return type : Object || void(null) - around 메소드가 return 하는 값이 호출한 client로 넘어간다.
	 * 					void - 모든 pointcut의 return 타입이 void인 경우 선언
	 * 매개변수 : 없거나 ProceedingJoinPoint으로 선언
	 * 					ProceedingJoinPoint : JoinPoint의 하위로 호출된 핵심 메소드를 호출하는 기능을 제공.(proceed())
	 * throws : Throwable - around메소드가 던지는 오류가 호출한 곳으로 던져진다.
	 */
	private Logger logger = Logger.getLogger(LogAspect.class);

	public Object aroundLog(ProceedingJoinPoint pjp) throws Throwable{
		String callerMethod = pjp.getTarget().getClass().getName() + "." + pjp.getSignature().getName();
		
		logger.info("aroundLog() 실행 - before : 핵심 메소드 호출 전");
		try{
			Object retValue = pjp.proceed();//핵심 메소드를 호출. 핵심 메소드에서 리턴한 값을 Object 타입으로 리턴. 핵심메소드가 던진 오류 객체를 throws

			logger.info("aroundLog() 실행 - after-returning : 핵심 메소드 정상 처리 후 ");
			return retValue;
		}catch(Throwable e){
			logger.error("aroundLog() 실행 - after-throwing : 핵심메소드 오류 발생");
			throw e;
		}finally{
			logger.info("aroundLog() 실행 - after : 핵심메소드 실행 후 ");
		}
	}
}
